/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#pragma once

#include "节点/节点.h"
#include "节点/输入输出节点.h"
#include "节点/插座/C_物体插座.h"
#include "节点/插座/list/list矢量插座.h"

#include <材质/材质.h>




class C_材质槽节点 : public C_节点基类 {
	//S_材质* m_材质;
	S_MaterialArray* materials;
public:
	C_材质槽节点(S_设备环境& ctx);
	~C_材质槽节点();

	bool	f_update();
	//void	f_读取(FILE* f);
	//void	f_写入(FILE* f);
};

C_节点基类* f_node_创建材质槽节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载材质槽节点(S_设备环境& ctx, FILE* f);
void		f_node_保存材质槽节点(C_节点基类* n, FILE* f);


class C_材质节点 : public C_节点基类 {
	S_材质* m_材质;

	std::vector<C_节点基类*> m_InNodes;
	std::vector<C_节点基类*> m_OutNudes;
public:
	C_材质节点(S_设备环境& ctx, C_节点树* link_tree);
	~C_材质节点();

	S_Props		m_灯光标志位;
	S_Props		m_材质节点树;

	expand_接口函数_材质节点 m_函数指针;

	void f_get子集输入节点(std::vector<C_节点基类*>& inNodes);
	void f_get子集输出节点(std::vector<C_节点基类*>& outNodes);

	bool	f_update();
	std::string DEF_节点编译函数;
	void		f_异步解算();

	void	f_读取(FILE* f);
	void	f_写入(FILE* f);
};

C_节点基类* f_node_创建材质节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载材质节点(S_设备环境& ctx, FILE* f);
void		f_node_保存材质节点(C_节点基类* n, FILE* f);




class C_当前材质节点 : public C_节点基类 {
	
public:
	C_当前材质节点(S_设备环境& ctx);
	~C_当前材质节点();

	bool		f_update();
	std::string	DEF_节点编译函数;
	void	f_读取(FILE* f);
	void	f_写入(FILE* f);
};

C_节点基类* f_node_创建当前材质节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载当前材质节点(S_设备环境& ctx, FILE* f);
void		f_node_保存当前材质节点(C_节点基类* n, FILE* f);




class C_着色器节点 : public C_节点基类 {
	std::vector<C_节点基类*> m_InNodes;
	std::vector<C_节点基类*> m_OutNudes;
public:
	C_着色器节点(S_设备环境& ctx, C_节点树* link_tree);
	~C_着色器节点();

	S_Props		m_外部加载;
	S_Props		m_着色阶段;
	//S_Props		m_代码文件路径;
	S_Props		m_源码类型;
	S_Props		m_节点树;
	

	void f_get子集输入节点(std::vector<C_节点基类*>& inNodes);
	void f_get子集输出节点(std::vector<C_节点基类*>& outNodes);

	bool	f_update();
	std::string DEF_节点编译函数;

	void	f_读取(FILE* f);
	void	f_写入(FILE* f);

	//C_插座基类* f_动态添加插座(E_插座方向 方向, std::vector<S_添加的插座>& 添加的插座);
	//int32		f_动态删除插座(E_插座方向 方向, std::vector<S_删除的插座>& 删除的插座);
};

C_节点基类* f_node_创建着色器节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载着色器节点(S_设备环境& ctx, FILE* f);
void		f_node_保存着色器节点(C_节点基类* n, FILE* f);




class C_自发光材质节点 : public C_节点基类 {

public:
	C_自发光材质节点(S_设备环境& ctx);
	~C_自发光材质节点();

	S_Props		m_计算方式;
	S_Props		m_是否改变原数据;
	S_Props		m_执行代码;

	bool	f_update();

	void	f_读取(FILE* f);
	void	f_写入(FILE* f);
};

C_节点基类* f_node_加载自发光材质节点(S_设备环境& ctx, FILE* f);
void		f_node_保存自发光材质节点(C_节点基类* n, FILE* f);





class C_设置物体材质节点 : public C_节点基类 {
	
public:
	C_设置物体材质节点(S_设备环境& ctx);
	~C_设置物体材质节点();

	bool	f_update();

	void	f_读取(FILE* f);
	void	f_写入(FILE* f);
};

C_节点基类* f_node_创建设置物体材质节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载设置物体材质节点(S_设备环境& ctx, FILE* f);
void		f_node_保存设置物体材质节点(C_节点基类* n, FILE* f);




class C_PBR材着色器节点 : public C_节点基类 {

public:
	C_PBR材着色器节点(S_设备环境& ctx, C_节点树* link_tree);
	~C_PBR材着色器节点();

	S_Props		m_颜色;
	S_Props		m_发光;
	S_Props		m_反射;
	S_Props		m_折射;
	S_Props		m_粗糙;
	S_Props		m_透明;

	//S_Props		m_外部加载;
	//S_Props		m_代码文件路径;
	S_Props		m_节点树;

	void f_get子集输入节点(std::vector<C_节点基类*>& inNodes);
	void f_get子集输出节点(std::vector<C_节点基类*>& outNodes);

	bool	f_update();
	std::string DEF_节点编译函数;

	void	f_读取(FILE* f);
	void	f_写入(FILE* f);

	void	f_入回收();
	void	f_回收();
};

C_节点基类* f_node_创建设置PBR材质属性节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载设置PBR材质属性节点(S_设备环境& ctx, FILE* f);
void		f_node_保存设置PBR材质属性节点(C_节点基类* n, FILE* f);




class C_基于物理计算着色节点 : public C_节点基类 {

public:
	C_基于物理计算着色节点(S_设备环境& ctx);
	~C_基于物理计算着色节点();

	S_Props		m_外部加载;
	

	bool	f_update();
	std::string DEF_节点编译函数;

	void	f_读取(FILE* f);
	void	f_写入(FILE* f);

};

C_节点基类* f_node_创建基于物理计算着色节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载基于物理计算着色节点(S_设备环境& ctx, FILE* f);
void		f_node_保存基于物理计算着色节点(C_节点基类* n, FILE* f);







class C_几何数据节点 : public C_节点基类 {

public:
	C_几何数据节点(S_设备环境& ctx);
	~C_几何数据节点();

	bool	f_update();
	std::string DEF_节点编译函数;

	void	f_读取(FILE* f);
	void	f_写入(FILE* f);

};

C_节点基类* f_node_创建几何数据节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载几何数据节点(S_设备环境& ctx, FILE* f);
void		f_node_保存几何数据节点(C_节点基类* n, FILE* f);



class C_光线数据节点 : public C_节点基类 {

public:
	C_光线数据节点(S_设备环境& ctx);
	~C_光线数据节点();

	bool	f_update();
	std::string DEF_节点编译函数;

	void	f_读取(FILE* f);
	void	f_写入(FILE* f);

};

C_节点基类* f_node_创建光线数据节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载光线数据节点(S_设备环境& ctx, FILE* f);
void		f_node_保存光线数据节点(C_节点基类* n, FILE* f);



class C_几何UV数据节点 : public C_节点基类 {

public:
	C_几何UV数据节点(S_设备环境& ctx);
	~C_几何UV数据节点();

	S_Props		m_UV类型;

	bool	f_update();
	std::string DEF_节点编译函数;

	void	f_读取(FILE* f);
	void	f_写入(FILE* f);

};

C_节点基类* f_node_创建几何UV数据节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载几何UV数据节点(S_设备环境& ctx, FILE* f);
void		f_node_保存几何UV数据节点(C_节点基类* n, FILE* f);



